package 泛型通配符的有关数据输入;

import java.util.ArrayList;
import java.util.List;

/**
 * 演示自定义泛型类，以及<?>与<T>区别
 */
public class BoxTest{

    public Class<String> clazz = String.class;

    public static void main(String[] args) {
        People people = new People();

        //（1）创建不带泛型对象
        Box box = new Box();
        box.setObject(people);
        //获取对象时，需要进行强制类型转换
        People p2 = (People) box.getObject();
        System.out.println(p2);
        System.out.println("-----------------------------------");

        //（2）创建带泛型的对象
        Box<String> box1 = new Box<>();
        Box<Integer> box2 = new Box<>();
        //只能设置泛型类型的对象
        box1.setObject("zhangSan");
        box2.setObject(66);
//        box1.setObject(people);//会报异常
        String object = box1.getObject();
        Integer object1 = box2.getObject();
        System.out.println(object);
        System.out.println(object1);
        System.out.println("-----------------------------------");

        //<?>使用任意类型
        Box<?> box3 = new Box<>();
//        box3.setObject(people);//会报错，没法赋值。因为规定是任意类型，就不能使用具体的类型去赋值
    }

    //泛型方法：
    public static <E> List<E> copyToArrayList(E[] arr) {
        ArrayList<E> list = new ArrayList<>();

        for (E e1 : arr) {
            list.add(e1);
        }

        return list;
    }
}

/**
 * 自定义泛型类：
 *      概念：即，普通类后面加个泛型标签；
 *      <T>作用：
 *              （1）相当于给这个类中声明一个 “任意类” 类型，类名叫 “T”；
 *              （2）也可以叫其他大写字母,例如：A,B,C,D.....等等；
 *              （3）也可以声明多个<T,B,C,D.....>任意类类型
 *              （4）可以作为非静态属性的类型、非静态方法的参数类型、非静态方法的返回值类型。但在静态方法中不能使用类的泛型。
 *              （5）T 可以继承某个类，但是不能实现某个接口
 *
 *      注意：泛型接口的创建与泛型类创建方法类似
 * @param <T>
 */
class Box<T> {

    private T object;

    public void setObject(T object) {
        this.object = object;
    }

    public T getObject() {
        return object;
    }
}

class Tom<T extends Object> {

    private T object;

    public void setObject(T object) {
        this.object = object;
    }

    public T getObject() {
        return object;
    }
}

class Tim<T extends Box> {

    private T object;

    public void setObject(T object) {
        this.object = object;
    }

    public T getObject() {
        return object;
    }
}

class Jim<Box>{
//    Box box = new Box();//不能用来赋值，因为这个值是外部传入进来的
    private Box box;

    public void main(String[] args) {

    }
}